#include <cstdio>

struct S1
{
	char c1;
	int i;
	char c2;
};

int main()
{
	printf("%zd\n", sizeof(struct S1));
	return 0;
}

// 分析
// c1 => 0 offset
// i对齐数=4 -> i => 4 offset
// c2对齐数=1 -> c2 => 8 offset
// 此时占9个字节空间
// 最大对齐数=4 -> 总大小是最大对齐数整数倍 -> 总大小=12 byte

// --------------------------------------------------------------------------------------


struct S2
{
	char c1;
	char c2;
	int i;
};

int main()
{
	printf("%zd\n", sizeof(struct S1));
	return 0;
}

// 分析
// c1 => 0 offset
// c2对齐数=1 -> c2 => 1 offset
// i对齐数=4 -> i => 4 offset
// 此时占8个字节空间
// 最大对齐数=4 -> 总大小是最大对齐数整数倍 -> 总大小=8 byte

// --------------------------------------------------------------------------------------

struct S2
{
	char c1;
	char c2;
	int i;
};
struct S3
{
	char c1;
	struct S2 s;
	double d;
};

int main()
{
	printf("%d\n", sizeof(struct S3));
	return 0;
}

// 分析
// s2 :
// c1 => 0 offset
// c2 => 1 offset
// i => 4 offset
// 总大小是8字节
// s3 : 
// c1 => 0 offset
// s对齐数=4(最大对齐数) => 4 offset 
// d对齐数=8 => 16 offset
// 此时占23 byte空间
// 最大对齐数=8 => 总大小= 24字节
